home *** CD-ROM | disk | FTP | other *** search
/ DP Tool Club 19 / CD_ASCQ_19_010295.iso / dos / prg / pas / swag / printing.swg / 0039_Printing Epson Graphics.pas < prev    next >
Pascal/Delphi Source File  |  1994-11-30  |  4KB  |  117 lines

  1. {
  2. From: randyd@alpha2.csd.uwm.edu (Randall Elton Ding)
  3.  
  4. >Does anyone have any code that shows how one might print some graphics
  5. >on a 9 or 24-pin Epson compatible dot-matrix printer?  I'm specifically
  6.  
  7. I pulled this out of my graphstuff unit which I made years ago.  It
  8. was designed for my epson mx100 (thats mx not fx) printer... early 80's.
  9. The mx printer has 9 pins and only 8 are used for graphics.
  10. Hopefully the escape codes are the same for your newer epson.
  11. }
  12.  
  13. program foo;
  14.  
  15. uses graph;
  16.  
  17. const
  18.   rotate90 = true;
  19.   widepaper = false;
  20.  
  21.  
  22. procedure developgraph(rotate: boolean);
  23.                             { if passed parameter is true, the graphics
  24.                               image will be rotated 90 degrees to fit on
  25.                               a narrow sheet of printer paper, if false
  26.                               the image will completely fill the wide
  27.                               paper erect and double height }
  28.  
  29.   const maxprinter = 816;   { maximum pixel width of printer }
  30.  
  31.   var
  32.     graphwidth,graphheight,printerwidth,printerheight: integer;
  33.     n1,n2,sx,sy,x,y,y2,pixcolr: integer;
  34.     widthratio,heightratio: real;
  35.     blank: boolean;
  36.     bitloc,bits: byte;
  37.     bytes: array [1..maxprinter] of byte;
  38.     lst: text;
  39.  
  40.   begin
  41.     assign(lst,'lpt1');
  42.     rewrite(lst);
  43.     case rotate of
  44.       widepaper: begin                       { develop erect on wide paper }
  45.                    graphwidth:= getmaxx+1;
  46.                    graphheight:= getmaxy+1;
  47.                    printerwidth:= maxprinter;       { scale 1.275 x 2 }
  48.                    printerheight:= graphheight*2;
  49.                  end;
  50.       rotate90:  begin                     { if rotate then reverse x and y }
  51.                    graphwidth:= getmaxy+1;
  52.                    graphheight:= getmaxx+1;
  53.                    printerwidth:= graphwidth;       { scale 1 x 1 }
  54.                    printerheight:= graphheight;
  55.                  end;
  56.     end;
  57.     n2:= printerwidth div 256;
  58.     n1:= printerwidth mod 256;
  59.     write (lst,chr(27),'A',chr(8));   { set line spacing to 8 }
  60.     widthratio:= printerwidth/graphwidth;
  61.     heightratio:= printerheight/graphheight;
  62.     y:= 0;
  63.     while y < printerheight do begin
  64.       blank:= true;    { remains true if entire printer pass is blank }
  65.       for x:= 1 to printerwidth do begin
  66.         sx:= trunc ((x-1)/widthratio);  { screen x coorid }
  67.         bits:= 0;
  68.         bitloc:= $80;
  69.         for y2:= y to y+7 do begin
  70.           sy:= trunc(y2/heightratio);  { screen y coorid }
  71.           if sy < graphheight then begin { last printer pass is incomplete }
  72.             case rotate of
  73.               widepaper: pixcolr:= getpixel (sx,sy);
  74.               rotate90:  pixcolr:= getpixel (sy,sx);   { x and y swaped }
  75.             end;
  76.             if pixcolr > 0 then bits:= bits or bitloc;
  77.           end;
  78.           bitloc:= bitloc shr 1;
  79.         end;
  80.         case rotate of
  81.           widepaper: bytes [x]:= bits;
  82.           rotate90:  bytes [printerwidth-x+1]:= bits;  { reverse image }
  83.         end;
  84.         if bits > 0 then blank:= false; { have something to print this pass }
  85.       end;
  86.       if not blank then begin    { line feed if nothing to print this pass }
  87.         write (lst,chr(27),'K',chr(n1),chr(n2));  { set printer graph mode }
  88.         for x:= 1 to printerwidth do write (lst,chr(bytes[x]));
  89.       end;
  90.       writeln (lst);   { output 8 printer pixels high per pass }
  91.       y:= y+8;
  92.     end;
  93.     write (lst,chr(12));       { top of form }
  94.     write (lst,chr(27),'@');   { re-initalize printer }
  95.     close(lst);
  96.   end;
  97.  
  98. Var
  99.   gd, gm,
  100.   Count  : Integer;
  101.  
  102.  
  103. begin
  104.   { Demo By Kerry Sokalsky - SWAG Support Team }
  105.  
  106.   Gd := Detect;
  107.   InitGraph(gd, gm, 'e:\bp\bgi');
  108.  
  109.   For Count := 1 to 100 do
  110.     Circle(Random(500) + 50, Random(380) + 50, Random(50));
  111.  
  112.   Readln;
  113.   DevelopGraph(False);
  114.   Readln;
  115.  
  116. end.
  117.